#include <string>
#include <cctype>
using namespace std;
/*
 * @lc app=leetcode.cn id=8 lang=cpp
 *
 * [8] 字符串转换整数 (atoi)
 */

// @lc code=start
class Solution {
public:
    int myAtoi(string s) {
        int res = 0, signal = 0;
        bool flag = false;
        int i = 0;
        while (i < s.length()) {
            // 判断是否之前的溢出
            if (res > INT_MAX / 10 || res < INT_MIN / 10) {
                if (isdigit(s[i])) {
                    return signal == 1 ? INT_MAX : INT_MIN;
                }
            }
            // 判断最后一位是否溢出
            if (res == INT_MAX / 10 || res == INT_MIN / 10) {
                if (isdigit(s[i]) && signal == 1 && s[i] - '0' >= 8) {
                    return INT_MAX;
                }
                else if (isdigit(s[i]) && signal == -1 && s[i] - '0' >= 9)
                    return INT_MIN;
            }
            // 是否前导空格
            if (!flag && s[i] == ' ') {
                i++; continue;
            }
            // 是否前导标识符
            else if (!flag && signal == 0) {
                if (s[i] == '-') signal = -1;
                else if (s[i] == '+') signal = 1;
                else if (isdigit(s[i])) {
                    signal = 1;
                    res = res * 10 + s[i] - '0';
                }
                else break;
                flag = true;
            }
            // 是否数字
            else if (isdigit(s[i])) {
                res = res * 10 + signal * (s[i] - '0');
            }
            // 都不是, 终止
            else break;
            i++;
        }
        return res;
    }
};
// @lc code=end

